{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 策略构建示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "revenue_yoy = pd.read_csv('revenue_yoy_zz500.csv', index_col=0)\n",
    "pb = pd.read_csv('pb_zz500.csv', index_col=0)\n",
    "\n",
    "returns = pd.read_csv('returns_zz500.csv', index_col=0) * 0.01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# benchmark returns\n",
    "\n",
    "zz500_index = pd.read_csv('zz500_index.csv', index_col=0)['000905.SH']\n",
    "\n",
    "bm_returns = zz500_index.pct_change().fillna(0.).cumsum().tolist()  #计算前后两天的收益率，进行缺失值填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算中正500的累计收益率\n",
    "# 对因子进行归一化处理：对因子进行排序\n",
    "\n",
    "rev_rank = revenue_yoy.rank(axis=1) / 500\n",
    "pb_rank = pb.rank(axis=1) / 500"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x17fa41bf550>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 进行多因子叠加\n",
    "\n",
    "strat_returns = [0]\n",
    "\n",
    "for i in range(len(returns) - 1):\n",
    "    \n",
    "#     selected = pb_rank.iloc[i] > 0.8\n",
    "#     selected = (rev_rank.iloc[i] * 0.6 + pb_rank.iloc[i] * 0.4) > 0.8   \n",
    "    selected = (rev_rank.iloc[i] > 0.8) & (pb_rank.iloc[i] > 0.8)\n",
    "    \n",
    "# 得到策略收益率并进行记录\n",
    "    ret = returns.iloc[i + 1].loc[selected].mean()\n",
    "    \n",
    "    strat_returns.append(ret)\n",
    "    \n",
    "plt.plot(pd.Series(strat_returns).cumsum(), label='strategy')   # 计算策略收益的累加值\n",
    "plt.plot(bm_returns, label='benchmark')     # 计算基准指数（中正500指数）收益的累加值\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "000519.SZ    False\n",
       "002690.SZ     True\n",
       "000960.SZ    False\n",
       "002233.SZ    False\n",
       "600970.SH    False\n",
       "             ...  \n",
       "688065.SH    False\n",
       "688188.SH    False\n",
       "688289.SH    False\n",
       "688521.SH    False\n",
       "688536.SH    False\n",
       "Name: 20190102, Length: 500, dtype: bool"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pb_rank.iloc[0] > 0.8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# More\n",
    "\n",
    "还需考虑的：\n",
    "- 股票权重\n",
    "- 手续费\n",
    "- 涨跌停\n",
    "- 股数四舍五入\n",
    "- ......\n",
    "\n",
    "如果想要更精细的回测及分析，可以使用一些量化平台的回测接口。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
